home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / d_array.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  2.5 KB  |  80 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  d_array.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. //------------------------------------------------------------------------------
  18. // d_array 
  19. //
  20. // Stefan Naeher (1989)
  21. //------------------------------------------------------------------------------ 
  22.  
  23. #ifndef DARRAYH
  24. #define DARRAYH
  25.  
  26. #ifndef RBTREEH 
  27. #include <LEDA/rb_tree.h> 
  28. #endif
  29.  
  30. #define d_array(itype,etype) name3(itype,etype,d_array)
  31.  
  32. #define d_arraydeclare2(itype,etype)\
  33. \
  34. struct d_array(itype,etype) : public rb_tree {\
  35. \
  36. etype init;\
  37. rb_tree_node* iterator;\
  38. \
  39. int  cmp(ent& x, ent& y) const { return compare(*(itype*)&x,*(itype*)&y); }\
  40. void clear_key(ent& x)   const { Clear(*(itype*)&x); }\
  41. void clear_inf(ent& x)   const { Clear(*(etype*)&x); }\
  42. void copy_key(ent& x)    const { Copy(*(itype*)&x);  }\
  43. void copy_inf(ent& x)    const { Copy(*(etype*)&x);  }\
  44. \
  45. etype&  operator[](itype y) { rb_tree_node* i=rb_tree::lookup(Ent(y));\
  46.                               if (i==nil) i=rb_tree::insert(Ent(y),Ent(init));\
  47.                               return *(etype*)&rb_tree::info(i); }\
  48. /*\
  49. etype   operator[](itype y) const\
  50.                             { rb_tree_node* i=rb_tree::lookup(Ent(y));\
  51.                               if (i==nil) return init;\
  52.                               else return etype(rb_tree::info(i)); }\
  53. */\
  54. bool defined(itype y)  const { return (rb_tree::lookup(Ent(y))!=nil); }\
  55. void init_iterator()         { iterator = rb_tree::first_item(); }\
  56. bool next_index(itype& y)    { if (iterator==0) return false;\
  57.                                else { void* p = rb_tree::key(iterator);\
  58.                                       y = *(itype*)&p;\
  59.                                       iterator = rb_tree::next_item(iterator);\
  60.                                       return true; } \
  61.                               }\
  62. \
  63.  d_array(itype,etype)() {};\
  64.  d_array(itype,etype)(etype i) { init=i; }\
  65. \
  66.  d_array(itype,etype)(const d_array(itype,etype)& A) : rb_tree((rb_tree&) A)\
  67.  { init=A.init; }\
  68. \
  69.  d_array(itype,etype)& operator=(const d_array(itype,etype)& A)\
  70.  { rb_tree::operator=((rb_tree&)A); init=A.init; return *this; }\
  71. \
  72. ~d_array(itype,etype)()        { clear(); };\
  73. } ;
  74.  
  75. #define forall_defined(i,A)  for ((A).init_iterator(); (A).next_index(i); )
  76.  
  77.  
  78. #endif
  79.